package main

import "fmt"

// 数值类型：
// 1.1 整型（有符号）：int int8 int16 int32 int64
// 1.1 整型（无符号）：uint uint8  uint16 uint32 uint64
// 1.1 整型（byte）= uint8
// 1.2 浮点型 float32 float64

// ---
// %v	值的默认格式表示
// %+v	类似%v，但输出结构体时会添加字段名
// %#v	值的Go语法表示
// %T	值的类型的Go语法表示
// %%	百分号
func main() {
	testInt()
	fmt.Println()
	testUint()
	fmt.Println()
	testByte()
	fmt.Println()
	testFloat()

}

// %b	表示为二进制
// %c	该值对应的unicode码值
// %d	表示为十进制
// %o	表示为八进制
// %q	该值对应的单引号括起来的go语法字符字面值，必要时会采用安全的转义表示
// %x	表示为十六进制，使用a-f
// %X	表示为十六进制，使用A-F
// %U	表示为Unicode格式：U+1234，等价于"U+%04X"
func testInt() {
	var n1 = 1 //默认int
	var n2 int = 11
	var n3 int8 = 11
	var n4 int16 = 12
	var n5 int32 = 13
	var n6 int64 = 16

	var a1 uint = 10
	var a2 uint8 = 13
	var a3 uint16 = 13
	var a4 uint32 = 32
	var a5 uint64 = 53

	var b1 byte = 1
	var b2 byte = 'a'

	var f1 = 1.0 //默认float64
	var f2 float32 = 2.3
	var f3 float64 = 3.5
	fmt.Printf("%T %v \n", n1, n1)
	fmt.Printf("%T %v \n", n2, n2)
	fmt.Printf("%T %v \n", n3, n3)
	fmt.Printf("%T %v \n", n4, n4)
	fmt.Printf("%T %v \n", n5, n5)
	fmt.Printf("%T %v \n", n6, n6)

	fmt.Printf("%T %v \n", a1, a1)
	fmt.Printf("%T %v \n", a2, a2)
	fmt.Printf("%T %v \n", a3, a3)
	fmt.Printf("%T %v \n", a4, a4)
	fmt.Printf("%T %v \n", a5, a5)

	fmt.Printf("%T %v \n", b1, b1)
	fmt.Printf("%T %v \n", b2, b2)

	fmt.Printf("%T %v \n", f1, f1)
	fmt.Printf("%T %v \n", f2, f2)
	fmt.Printf("%T %v \n", f3, f3)

}

func testUint() {
	var a1 uint = 1
	var b1 uint8 = 2
	var c1 uint16 = 3
	var d1 uint32 = 4
	var e1 uint64 = 5
	fmt.Printf("%T a1=%d \n", a1, a1)
	fmt.Printf("%T b1=%d \n", b1, b1)
	fmt.Printf("%T c1=%d \n", c1, c1)
	fmt.Printf("%T d1=%d \n", d1, d1)
	fmt.Printf("%T e1=%d \n", e1, e1)

}

func testByte() {
	//不赋值，默认为0,byte等价 uint8
	var byte1 byte
	fmt.Printf("%T byte1=%d \n", byte1, byte1)
	byte1 = 12
	fmt.Printf("%T byte1=%d \n", byte1, byte1)
}

// TestFloat
// %b	无小数部分、二进制指数的科学计数法，如-123456p-78；参见strconv.FormatFloat
// %e	科学计数法，如-1234.456e+78
// %E	科学计数法，如-1234.456E+78
// %f	有小数部分但无指数部分，如123.456
// %F	等价于%f
// %g	根据实际情况采用%e或%f格式（以获得更简洁、准确的输出）
// %G	根据实际情况采用%E或%F格式（以获得更简洁、准确的输出）
func testFloat() {
	var f1 = 1.0 //默认是float64
	fmt.Println("f1=", f1)
	fmt.Printf("%T f1=%f \n", f1, f1)

	var f2 float32 //默认0
	fmt.Printf("%T f2=%f \n", f2, f2)
	f2 = 3.3
	fmt.Printf("%T f2=%f \n", f2, f2)

	var f3 float64
	fmt.Printf("%T f3=%f \n", f3, f3)
	f3 = 3.3
	fmt.Printf("%T f3=%f \n", f3, f3)

}
